package Interfaz;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

import models.Empleados;
import models.FranjaHoraria;
import models.Reservas;
import models.Socio;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.event.spi.SaveOrUpdateEvent;

import connection.HibernateUtil;

public class ReservaWindow extends JFrame {

	public Session DAO;
	public ArrayList <Socio> socios;
	
	private Empleados empleado;
	private JPanel panel;
	private JLabel actionBar;
	private JLabel marcoUser;
	private JLabel nombreUsuario;
	private JLabel logoSmall;
	private JButton find;
	private JTextField findText;
	private String[] cols = { "id", "Pista", "Nombre", "Hora" };
	private JTable reservasTable;
	private JTableHeader header;
	private JScrollPane scroll;
	private JLabel fastView;
	private JLabel nombreEmpleado;
	boolean cancelar = true;
	private JButton buscarClientesBtn;
	private JLabel fechaSeleccionadaLabel;
	private boolean actualizar = false;
	private Reservas reservaActiva;
	private Socio socioActivo;
	// Declarar variables del fastView

	JLabel nombreLbl = new JLabel("Nombre: ");
	JLabel valorNombreLbl = new JLabel();
	JLabel fechaLbl = new JLabel();

	JLabel franjaLbl = new JLabel("Horario: ");
	JComboBox franjaCombo = new JComboBox();
	JLabel pistaLbl = new JLabel("Pista: ");
	JComboBox pistaComboBox = new JComboBox();
	JLabel anuladoLbl = new JLabel("Anular: ");
	JCheckBox anuladoChec = new JCheckBox();

	JLabel fotoFastView;
	JButton buscarFechaBtn = new JButton("Buscar fecha");
	JButton fechaBtn = new JButton("Seleccionar fecha");
	ReservaWindow context = this;

	JButton saveBtn;
	JButton deleteBtn;
	JButton nuevoBtn;
	int idSeleccionado;
	boolean nuevo = false;
	// Declarar variables del fastView END//
	private DefaultTableModel model;
	private SimpleDateFormat sdf;
	private SimpleDateFormat sdfFecha;
	public ReservaWindow exec;


	/**
	 * metodo constructor de la clase reservas en la cual creamos la conexion
	 * con la base de datos despues llamamos al metodo initcomponents que
	 * inicializa todos los atributos y llamamos al metodo addActionListener que
	 * contiene todos los listeners de los botones
	 * 
	 * @param empleado
	 */
	public ReservaWindow(Empleados empleado) {
		this.empleado = empleado;
		sdfFecha = new SimpleDateFormat("dd/MM/yyyy");
		initJFrameComponents();
		addActionListeners();
	}

	

	/**
	 * metodo que inicializa todas las variables de nuestro modulo y les da una
	 * posicion dentro del panel y las hace visibles
	 * 
	 */
	public void initJFrameComponents() {
		// Instanciar declaraciones
		sdf = new SimpleDateFormat("HH:00");
		panel = new JPanel();
		actionBar = new JLabel();
		marcoUser = new JLabel();
		logoSmall = new JLabel(new ImageIcon(getClass().getResource(
				"raw/logo_small.jpg")));
		nombreUsuario = new JLabel("Gestión Reservas");
		find = new JButton();
		findText = new JTextField();
		fastView = new JLabel(new ImageIcon(getClass().getResource(
				"raw/fastView.png")));
		nombreEmpleado = new JLabel("Reserva seleccionada");
		saveBtn = new JButton();
		deleteBtn = new JButton();
		nuevoBtn = new JButton();
		franjaCombo = new JComboBox(obtenerFranjasTexto());
		buscarClientesBtn = new JButton("Buscar");
		fechaSeleccionadaLabel = new JLabel();
		// Instanciar declaraciones END//
		// Asignar propiedades
		actionBar.setBackground(Color.BLACK);
		actionBar.setForeground(Color.BLACK);
		actionBar.setBounds(0, 0, 800, 32);
		actionBar.setOpaque(true);
		deleteBtn.setVisible(false);
		marcoUser.setBackground(new Color(0xEEEEEE));
		marcoUser.setForeground(new Color(0xEEEEEE));
		marcoUser.setBounds(32, 10, 98, 98);
		marcoUser.setOpaque(true);

		logoSmall.setBounds(36, 14, 90, 90);

		nombreUsuario.setBounds(150, 3, 256, 25);
		nombreUsuario.setForeground(Color.WHITE);
		nombreUsuario.setFont(new Font("Serif", Font.BOLD, 18));

		find.setBounds(768, 0, 32, 32);
		find.setOpaque(true);
		find.setBackground(Color.GRAY);
		find.setForeground(Color.WHITE);
		find.setBorder(null);
		find.setIcon(new ImageIcon(getClass().getResource("raw/find.png")));
		findText.setBounds(668, 0, 100, 32);
		findText.setBorder(null);
		findText.setForeground(Color.WHITE);
		findText.setBackground(Color.GRAY);

		fastView.setBounds(297, 105, 481, 448);

		nombreEmpleado.setBounds(370, 130, 290, 40);
		nombreEmpleado.setFont(new Font("Helvetica", Font.BOLD, 24));

		nombreLbl.setBounds(305, 220, 100, 25);
		valorNombreLbl.setBounds(405, 225, 175, 18);
		buscarClientesBtn.setBounds(585, 225, 70, 18);
		pistaLbl.setBounds(305, 240, 100, 25);
		pistaComboBox.setBounds(405, 245, 250, 18);
		anuladoLbl.setBounds(305, 260, 100, 25);
		anuladoChec.setBounds(405, 265, 250, 18);
		franjaLbl.setBounds(305, 260, 100, 25);
		franjaCombo.setBounds(405, 265, 250, 18);
		fechaBtn.setBounds(510, 325, 140, 25);
		fechaLbl.setBounds(405, 330, 100, 18);
		buscarFechaBtn.setBounds(130, 120, 120, 25);
		fechaSeleccionadaLabel.setBounds(3, 120, 125, 18);

		saveBtn.setBackground(Color.WHITE);
		saveBtn.setBorder(null);
		saveBtn.setForeground(Color.WHITE);
		saveBtn.setIcon(new ImageIcon(getClass().getResource("raw/guardar.png")));
		saveBtn.setBounds(350, 500, 48, 48);

		deleteBtn.setBackground(Color.WHITE);
		deleteBtn.setBorder(null);
		deleteBtn.setForeground(Color.WHITE);
		deleteBtn.setIcon(new ImageIcon(getClass()
				.getResource("raw/borrar.png")));
		deleteBtn.setBounds(550, 500, 48, 48);

		nuevoBtn.setBackground(Color.WHITE);
		nuevoBtn.setBorder(null);
		nuevoBtn.setForeground(Color.WHITE);
		nuevoBtn.setIcon(new ImageIcon(getClass().getResource("raw/nuevo.png")));
		nuevoBtn.setBounds(450, 500, 48, 48);

		fotoFastView = new JLabel();
		fotoFastView.setBounds(667, 110, 98, 98);
		fotoFastView.setBorder(null);
		for (int i = 1; i < 9; i++) {
			pistaComboBox.addItem("" + i);
		}

		// Inflar la lista de datos y el scrollview
		reservasTable = new JTable();
		scroll = new JScrollPane(reservasTable);
		scroll.setBounds(0, 150, 250, 400);
		inflateList();
		// Asignar propiedades END//
		// Agragarlas a la interfaz.

		this.add(fotoFastView);
		this.add(scroll);
		this.add(nombreLbl);
		this.add(valorNombreLbl);
		this.add(nuevoBtn);
		this.add(pistaLbl);
		this.add(pistaComboBox);
		this.add(franjaLbl);
		this.add(franjaCombo);
		this.add(nombreEmpleado);
		this.add(logoSmall);
		this.add(findText);
		this.add(find);
		this.add(nombreUsuario);
		this.add(marcoUser);
		this.add(actionBar);
		this.add(saveBtn);
		this.add(deleteBtn);
		this.add(fastView);
		this.add(fechaBtn);
		this.add(buscarClientesBtn);
		this.add(buscarFechaBtn);
		this.add(fechaSeleccionadaLabel);
		this.add(fechaLbl);

		// Agragarlas a la interfaz END//
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		this.setBounds(((d.width / 2) - 400), ((d.height / 2) - 300), 800, 600);
		panel.setBackground(Color.WHITE);
		this.setTitle("MyBolos ERP  ->  " + empleado.getNombre() + " "
				+ empleado.getApellido1());
		this.add(panel);
		this.setBackground(Color.WHITE);
		this.setVisible(true);
		this.setResizable(false);
	}

	/**
	 * metodo que agrupa todas los losteners de nuestro modulo y les da una
	 * mison.
	 * 
	 */
	public void addActionListeners() {
		saveBtn.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				guardarReserva();

			}
		});
		buscarFechaBtn.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				Date fecha = CalendarioWindow.showCalendarioDialog(ReservaWindow.this);
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
				try{
				fechaSeleccionadaLabel.setText(sdf.format(fecha));
				}catch (Exception e){
					e.getStackTrace();
				}
				mostrarReservasFecha(fecha);
			}
		});
		fechaBtn.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				Date fecha = CalendarioWindow.showCalendarioDialog(ReservaWindow.this);
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
				try{
				fechaLbl.setText(sdf.format(fecha));
				}catch (Exception e){
					e.getStackTrace();
				}
			}
		});
		deleteBtn.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {

				borraReserva();

			}

		});
		nuevoBtn.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				nuevaReserva();
			}
		});

		buscarClientesBtn.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				Socio socio = BuscarClientesDialog
						.showBusquedaSociosDialog(buscarClientesBtn);
				socioActivo = socio;
				valorNombreLbl.setText(socio.getNombre());
			}
		});

	}

	private void borraReserva() {
		JOptionPane pane = new JOptionPane("¿Desea borrar la reserva? ");
		Object[] options = new String[] { "Si", "No" };
		pane.setOptions(options);
		JDialog dialog = pane.createDialog(new JFrame(),
				"Confirmación de borrado");
		dialog.setVisible(true);
		Object obj = pane.getValue();
		int result = -1;
		for (int k = 0; k < options.length; k++)
			if (options[k].equals(obj))
				result = k;
		if (result == 0) {
		    DAO = HibernateUtil.getSessionFactory().openSession();
			DAO.beginTransaction();
			DAO.delete(reservaActiva);
			DAO.getTransaction().commit();
			DAO.close();
			JOptionPane.showMessageDialog(null, "La reserva ha sido borrada");
		}
		String fechaTxt = fechaSeleccionadaLabel.getText();

		Date fecha;
		try {
			fecha = sdfFecha.parse(fechaTxt);
			mostrarReservasFecha(fecha);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		limpiarCampos();
	}

	/**
	 * metodo con el cual guardams una reserva en nuestra base de datos
	 * 
	 */
	protected void guardarReserva() {
		String pista = (String) pistaComboBox.getSelectedItem();
		String fecha = fechaLbl.getText();
		FranjaHoraria franja = (FranjaHoraria) franjaCombo.getSelectedItem();
		if (pista.equals("") || fecha.equals("") || socioActivo == null) {
			JOptionPane.showMessageDialog(this,"Falta alguno de los datos para poder realizar la reserva");
		} else {
			Reservas reserva = new Reservas();
			reserva.setSocio(socioActivo);
			reserva.setPista(Integer.parseInt(pista));
			try {
				reserva.setFecha(sdfFecha.parse(fecha));
			} catch (ParseException e) {
				e.printStackTrace();
			}
			reserva.setFranjaHoraria(franja);
			Session DAO = HibernateUtil.getSessionFactory().openSession();
			DAO.beginTransaction();
			DAO.persist(reserva);
			DAO.getTransaction().commit();
			DAO.close();
			JOptionPane.showMessageDialog(this,"La reserva se realizo con exito");

		}

	}

	/**
	 * metodo que setea los campos en blanco y recoje todos los datos que se
	 * metan dentro de los campos de texto y los guarda en la base de datos.
	 * 
	 */
	protected void nuevaReserva() {
		limpiarCampos();
		actualizar = false;
		valorNombreLbl.setEnabled(true);
		pistaComboBox.setEnabled(true);
		saveBtn.setVisible(true);
		franjaCombo.setEnabled(true);
		buscarClientesBtn.setVisible(true);
		fechaBtn.setVisible(true);
		deleteBtn.setVisible(false);

	}

	/**
	 * metodo que establece el valor de los campos de texto a blanco
	 * 
	 */
	private void limpiarCampos() {
		valorNombreLbl.setText("");
		pistaComboBox.setSelectedIndex(0);
		fechaLbl.setText("");
	}

	/**
	 * metodo que busca las reservas que se han realizado para un dia mediante
	 * el parametro "fecha" se guardan todos los resultados en una lista y se
	 * recorren con un bucle para posteriormente colocarlos en la tabla.
	 * 
	 * @param fecha
	 */
	protected void mostrarReservasFecha(Date fecha) {
		reservasTable.clearSelection();
		Session DAO = HibernateUtil.getSessionFactory().openSession();
		DAO.beginTransaction();
		Query query = DAO.createQuery("FROM Reservas WHERE fecha=:fecha");
		query.setParameter("fecha", fecha);
		List<Reservas> reservas = query.list();
		for (int i = 0; i < model.getRowCount(); i++) {
			model.removeRow(i);
		}
		for (int i = 0; i < reservas.size(); i++) {
			Reservas reserva = reservas.get(i);
			reservasTable.setValueAt(reserva.getId(), i, 0);
			reservasTable.setValueAt(reserva.getPista(), i, 1);
			reservasTable.setValueAt(reserva.getSocio().getNombreCompleto(), i,2);
			String franja=reserva.getFranjaHoraria().toString();
			reservasTable.setValueAt(franja, i, 3);

		}
		
		DAO.getTransaction().commit();
		DAO.close();
		
	}

	/**
	 * Rellena el JTable, lo instancia y lo crea
	 */
	public void inflateList() {

		String[][] socioMatriz = new String[100][4];
		header = reservasTable.getTableHeader();
		header.setBackground(Color.GRAY);
		header.setForeground(Color.WHITE);
		model = new DefaultTableModel(socioMatriz, cols);
		reservasTable.setModel(model);
		reservasTable.setBackground(Color.WHITE);
		reservasTable.setBorder(null);
		scroll.setBackground(Color.WHITE);
		scroll.setForeground(Color.WHITE);
		scroll.setBorder(null);
		reservasTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

		// Agregar el Listener a la tabla
		reservasTable.getSelectionModel().addListSelectionListener(
				new ListSelectionListener() {
					public void valueChanged(ListSelectionEvent arg0) {
						if (reservasTable.getSelectedRow() != -1) {
							mostrarDatosReserva((Integer) reservasTable
									.getValueAt(reservasTable.getSelectedRow(),
											0));

						}
					}
				});
		// Agregar el Listener a la tabla END//
	}

	/**
	 * metodo que muestra en la parte derecha los datos de la reserva mediante
	 * una parametro que le pasaremos: la "reservaID" que nos mostrara los datos
	 * de la reserva seleccionada luego se colocan los campos a no abilitados
	 * para que el empleado no pueda tocarlos ya que no vamos a modificar
	 * borraremos y crearemos una nueva.
	 * 
	 * @param reservaId
	 */
	protected void mostrarDatosReserva(Integer reservaId) {
		Session DAO = HibernateUtil.getSessionFactory().openSession();
		DAO.beginTransaction();
		Query query = DAO.createQuery("FROM Reservas WHERE id=:id");
		query.setParameter("id", reservaId);
		
		List reservas = query.list();
		if(reservas.size()==0){
			return;
		}
		Reservas reserva = (Reservas) reservas.get(0);
		valorNombreLbl.setText(reserva.getSocio().getNombreCompleto());
		for (int i = 0; i < 8; i++) {
			
			if (pistaComboBox.getItemAt(i).equals(""+reserva.getPista())){
				pistaComboBox.setSelectedIndex(i);
				break;
			}
		}
		FranjaHoraria franja = reserva.getFranjaHoraria();
		for (int i = 0; i < franjaCombo.getItemCount(); i++) {
			if (franjaCombo.getItemAt(i).equals(franja)) {
				franjaCombo.setSelectedIndex(i);
				break;
			}
		}
		DAO.close();
		reservaActiva = reserva;
		actualizar = true;
		valorNombreLbl.setEnabled(false);
		pistaComboBox.setEnabled(false);
		saveBtn.setVisible(false);
		franjaCombo.setEnabled(false);
		buscarClientesBtn.setVisible(false);
		fechaBtn.setVisible(false);
		deleteBtn.setVisible(true);
	}

	/**
	 * metodo con el que rellenamos el comboBox con las franjas formateandolas
	 * para que no den excepciones.
	 * 
	 * @return franjasTxt devuelve las franjas a las que se puede reservar
	 */
	public Object[] obtenerFranjasTexto() {
		Session DAO = HibernateUtil.getSessionFactory().openSession();
	    DAO.beginTransaction();
		List franjas = DAO.createQuery("FROM FranjaHoraria").list();
		DAO.close();
		return franjas.toArray();
	}



	public boolean createNewReserva(int i, String fecha) {
		boolean result = true;
		//ArrayList<Socio> socios;
		//public Date fecha = sdfFecha.parse(string);
		try {
			//String pista = (String) pistaComboBox.getSelectedItem();
			//String fecha = fechaLbl.getText();
			FranjaHoraria franja = (FranjaHoraria) franjaCombo.getSelectedItem();
			
				Reservas reserva = new Reservas();
				
				reserva.setPista(i);
				
				Socio socio = socios.get(1);
				socioActivo = socio;
				reserva.setSocio(socioActivo);
				try {
					reserva.setFecha(sdfFecha.parse(fecha));
				} catch (ParseException e) {
					e.printStackTrace();
				}
				reserva.setFranjaHoraria(franja);
				Session DAO = HibernateUtil.getSessionFactory().openSession();
				DAO.beginTransaction();
				DAO.persist(reserva);
				DAO.getTransaction().commit();
				DAO.close();
				

			
		} catch (Exception e) {
			result = false;
		}
		
		return result;
		
	}

}
